package city.spring.modules.checkinfeeDetail.service;

import city.spring.modules.checkinfeeDetail.entity.CheckinfeeDetailEntity;
import city.spring.modules.checkinfeeDetail.vo.CheckinfeeDetailVO;
import city.spring.modules.checkinfeeDetail.vo.PrintCheckinfeeVO;
import city.spring.modules.checkinfeeDetail.vo.PrintOldmanDepositVO;
import city.spring.modules.oldman.vo.OldmanDepositVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * Service：入院收费记录
 *
 * @author 谢金婷
 * @date 2020-08-24 15:46:11
 */
public interface CheckinfeeDetailService extends IService<CheckinfeeDetailEntity> {
    String CACHE_NAME = "checkinfee";

    /**
     * 业务处理：保存一个 <strong>入院收费记录</strong>
     *
     * @param entity 入院收费记录
     */
    void saveCheckinfee(CheckinfeeDetailEntity entity);

    /**
     * 业务处理：修改一个 <strong>入院收费记录</strong>
     *
     * @param entity 入院收费记录
     */
    void updateCheckinfee(CheckinfeeDetailEntity entity);

    /**
     * 业务处理：删除一个 <strong>入院收费记录</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteCheckinfee(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>入院收费记录</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteCheckinfee(List<String> primaryKeys);

    IPage<CheckinfeeDetailVO> listPage(Page<? extends CheckinfeeDetailEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeDetailEntity> wrapper);

    /**
     * 获取打印收据凭证的数据信息
     *
     * @param ids 消费记录ID列表
     * @return 打印凭据信息
     */
    PrintCheckinfeeVO getPrintReceiptInfo(List<String> ids);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的入院固定费用
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getFixedcostsByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的押金
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getDepositByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的入住月收费用类别
     *
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getMfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 计算入院收费本月应收费用总和
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    BigDecimal getSumReceivablethisMonth(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的餐饮费
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getDiningfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的水电费
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getUtilitybillByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    List<CheckinfeeDetailEntity> getCheckinfeeDetailByOldmanId(String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的餐饮费
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getDiningfeeByOldmanId(String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的水电费
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getUtilitybillByOldmanId(String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的押金
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getDepositByOldmanId(String oldmanId);

    /**
     * 根据老人id获取该老人的入院收费的其他费用
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailVO> getFixedcostsByOldmanId(String oldmanId);

    /**
     * 根据checkinfeeId 查找缴费明细
     *
     * @param checkinfeeId
     * @return
     */
    List<CheckinfeeDetailEntity> getCheckinfeeDetailByCheckinfeeId(String checkinfeeId);


    /**
     * 查找入院缴费的餐饮费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getDiningfee(String oldmanId);

    /**
     * 查找入院缴费的水电费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getUtilitybill(String oldmanId);

    /**
     * 月度缴费 获取应缴费用信息 （床位、护理、餐饮、水电、定制护理费）
     *
     * @param checkfeeid
     * @return
     */
    List<CheckinfeeDetailVO> monthPayInfo(String checkfeeid);

    /**
     * 月度缴费 获取应缴费用信息 （床位、护理、餐饮、水电、定制护理费）
     *
     * @param checkfeeid
     * @return
     */
    CheckinfeeDetailVO monthPayInfoOne(String checkfeeid, Integer typenum);

    /**
     * 查找入院缴费的追加月费用记录
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfee(String oldmanId);

    /**
     * 根据老人id和收费标记获取该老人的入院收费的追加月费用
     *
     * @param checkinfeeId
     * @param oldmanId
     * @param mark
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfeeByOldmanIdAndMark(String checkinfeeId, String oldmanId, String mark);

    /**
     * 根据老人id获取该老人的入院收费的追加月费用
     *
     * @param oldmanId
     * @return
     */
    List<CheckinfeeDetailEntity> getMonthlyfeeByOldmanId(String oldmanId);

    /**
     * 查找入院缴费的护理级别费用
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getAttendance(String oldmanId);

    /**
     * 查找入院缴费的定制护理费
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getPrivatecustomizationFee(String oldmanId);

    /**
     * 查找入院缴费的床位费用
     *
     * @param oldmanId
     * @return
     */
    CheckinfeeDetailEntity getBed(String oldmanId);

    /**
     * 查询所有的押金
     *
     * @return
     */
    IPage<OldmanDepositVO> oldmanDepositListPage(Page<? extends CheckinfeeDetailEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends CheckinfeeDetailEntity> wrapper);

    /**
     * 打印 押金收据
     *
     * @param ids
     * @return
     */
    PrintOldmanDepositVO getPrintOldmanDeposit(List<String> ids);

    /**
     * 获取月度缴费明细
     *
     * @param feeid
     * @return
     */
    List<CheckinfeeDetailVO> monthPayDetail(String feeid);

    /**
     * 获取押金及预存余额
     */
    CheckinfeeDetailVO getDepositAndBalance(String personId);

    /**
     * 退住结算：账单情况：罗列截至退住日期的需要交费的应付账单
     *
     * @param personId
     * @param leaveDate
     * @return
     */
    List<CheckinfeeDetailVO> billToLeaveDate(String personId, Date leaveDate, Date monthEnd);
}